package object_test;

import animal.Dog;
import supertest.Chinese;



interface ITest {
    void test();
}

class TestImpl implements ITest {

    @Override
    public void test() {
        System.out.println("hehe");
    }
}



public class ObjectTest {
    public static void main(String[] args) {
        // 接口引用
        ITest i1 = new TestImpl();
        // 整型数组引用
        int[] data = new int[10];
        // 只要是引用类型，都可以使用Object来接收
        Object obj1 = i1;
        Object obj2 = data;
//        // Object是所有类(JDK本身的类，自定义的类都是Object的子类)
//        Object obj1 = "abc";
////        China obj3 = new China();
//        Object obj2 = new Dog.java();
//        System.out.println(obj2);
//        Student stu1 = new Student("显平",80);
//        Student stu2 = new Student("怡洲",81);
//        Student stu3 = new Student("怡洲",81);
//        // "==" 比较的是数值，对于引用类型来讲，保存的内容就是一个地址
//        // 比地址
//        System.out.println(stu1 == stu2);
//        System.out.println(stu2 == stu3);
//        // 此时若需要比较两个对象的属性值是否相同，就需要按照比较规则覆写equals方法
//        System.out.println(stu2.equals(stu3));
    }
}

class Student {
    private String name;
    private int score;

    public Student(String name, int score) {
        this.name = new String(name);
        this.score = score;
    }

    @Override
    public boolean equals(Object obj) {
        // 1.若当前对象就是obj
        if (this == obj) {
            return true;
        }
        // 2.此时当前对象和obj指向的对象确实不是一个地址
        // 若此时obj指向的对象和Student压根没关系，obj指向一个Dog对象，没有可比性，直接返回false
        if (obj instanceof Student) {
            // 3.obj这个引用指向的对象确实是Student类的对象且和当前对象不是一个对象
            // Object obj = new Student();
            Student stu = (Student) obj;
            // 所有引用类型比较属性值一定要用equals方法，"=="比的是地址！！！！！！！！
            return this.score == stu.score && this.name.equals(stu.name);
        }
        return false;
    }
}